Program Listing for File kalman.h

Return to documentation for file (codes/cubicle_merge/kalman.h)

//
// Created by hd on 4/19/18.
//

#ifndef PROJECT_KALMAN_H
#define PROJECT_KALMAN_H

#include <Eigen/Dense>

class KalmanFilter
{
public:
    explicit KalmanFilter() = default;

    KalmanFilter(unsigned int dim_in, unsigned int dim_out, unsigned int dim_state):
            input_d(dim_in), output_d(dim_out), state_d(dim_state) {

        state_m.setIdentity(state_d, state_d);
        input_m.setZero(state_d, input_d);
        output_m.setZero(output_d, state_d);

        gain_m.setIdentity(state_d, output_d);
        I.setIdentity(state_d, state_d);

        P.setIdentity(state_d, state_d);
        Q.setIdentity(state_d, state_d);
        R.setIdentity(output_d, output_d);
        S.setIdentity(output_d, output_d);

        input_sig.setZero(input_d);
        q_pred.setZero(state_d);
        q_est.setZero(state_d);
        measure_sig.setZero(output_d);
    }

    void predictState() {
        q_pred = state_m * q_est + input_m * input_sig;
        P = state_m * P * state_m.transpose() + Q;
    }

    void correctState() {
        S = output_m * P * output_m.transpose() + R;
        gain_m = P * output_m.transpose() * S.inverse();
        q_est = q_pred + gain_m * (measure_sig - output_m * q_pred);
        P = (I - gain_m * output_m) * P;
    }

    void updateState() {
        predictState();
        correctState();
    }

    // Dimensions:
    unsigned int input_d{};                   // Input
    unsigned int output_d{};                  // Output
    unsigned int state_d{};                   // State

    // System matrices:
    Eigen::MatrixXd state_m;                // State
    Eigen::MatrixXd input_m;                // Input
    Eigen::MatrixXd output_m;               // Output

    // Kalman gain matrix:
    Eigen::MatrixXd gain_m;

    // Identity matrix
    Eigen::MatrixXd I;

    // Covariance matrices:
    Eigen::MatrixXd P;                      // Estimate error
    Eigen::MatrixXd Q;                      // Process
    Eigen::MatrixXd R;                      // Measurement
    Eigen::MatrixXd S;                      // Innovation

    // Signals:
    Eigen::VectorXd input_sig;              // Input
    Eigen::VectorXd q_pred;                 // Predicted state
    Eigen::VectorXd q_est;                  // Estimated state
    Eigen::VectorXd measure_sig;            // Measurement
};
#endif //PROJECT_KALMAN_H